package com.itranswarp.learnjava;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.itranswarp.learnjava.service.MailService;
import com.itranswarp.learnjava.service.User;
import com.itranswarp.learnjava.service.UserService;
import com.itranswarp.learnjava.service.Validators;

// 除了main()方法外，AppConfig标注了@Configuration，表示它是一个配置类，因为我们创建ApplicationContext时：
// ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class)
// 使用的实现类是AnnotationConfigApplicationContext，必须传入一个标注了@Configuration的类名
// 此外，AppConfig还标注了@ComponentScan，它告诉容器，自动搜索当前类所在的包以及子包，
// 把所有标注为@Component的Bean自动创建出来，并根据@Autowired进行装配，一个@Component就是一个Bean。
// 使用@Autowired就相当于把指定类型的Bean注入到指定的字段中,和XML配置相比，@Autowired大幅简化了注入
// 因为它不但可以写在set()方法上，还可以直接写在字段上，甚至可以写在构造方法中：
@Configuration
@ComponentScan
public class AppConfig {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        System.out.println("Hello, world!");
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        // 从容器中获取UserService: 为什么没有传参呢？因为UserService是一个Bean，它的类型是UserService，
        // 容器会自动把类型为UserService的Bean注入到UserService的字段中，
        // 所以我们在UserService中可以直接使用UserDao字段，而不需要手动注入。
        // 所以，我们只需要在UserService中定义一个UserDao字段，就可以使用UserDao了。
        // 这就是依赖注入的好处，我们只需要定义一个Bean，就可以使用它了，而不需要手动注入。

        UserService userService = context.getBean(UserService.class);
        User user = userService.login("bob@example.com", "password");
        System.out.println(user.getName());
        MailService mailService = context.getBean(MailService.class);
        // 原代码错误原因是在方法内部使用了类成员变量的定义语法，这里将其改为局部变量
        final String timeStemp = mailService.getTime();
        System.out.println(timeStemp + "\n11111");
        Validators validators = context.getBean(Validators.class);
        validators.validate("9492481999@qq.com", "13027683199", "dyc");

    }
}
